from PySide6.QtGui import QBrush, QPen, QCursor
from PySide6.QtWidgets import QGraphicsEllipseItem, QGraphicsItem

from 程序核心代码.mvvm重构.基础定义.基础图形项.节点接口 import 椭圆大小, 默认填充颜色, 默认边框颜色, 默认Z值, \
    连接线触发按键, \
    悬停光标, 默认光标, 椭圆偏移


class 连接点(QGraphicsEllipseItem):
    """
    连接点图形项类，继承自QGraphicsEllipseItem，用于表示连接点的图形元素。

    Attributes:
        状态 (连接点状态): 连接点的当前状态。
        连接线列表 (list): 存储连接线的列表。
        类型 (str): 连接点的类型（输入或输出）。
        流类型 (str): 连接点的流类型。
        状态管理 (连接点状态管理): 管理连接点状态的对象。
    """

    def __init__(self, 接口模型, 父项=None):
        """
        初始化连接点图形项。

        Args:
            x (float): 连接点的X坐标。
            y (float): 连接点的Y坐标。
            初始状态 (连接点状态): 连接点的初始状态。
            连接点类型 (str, optional): 连接点的类型（输入或输出）。默认为None。
            流类型 (str, optional): 连接点的流类型。默认为None。
            父项 (QGraphicsItem, optional): 父图形项。默认为None。
        """
        super().__init__(椭圆偏移, 椭圆偏移, 椭圆大小, 椭圆大小, parent=父项)
        # print("创建连接点图形项")
        #起始接口.setPos(x, y)
        #self.父项 = 父项
        self.接口模型 = 接口模型
        self.必须连接 = self.接口模型.必须连接
        self.设置图形属性()
        # 起始接口.连接点状态管理 = 连接点状态管理(起始接口)

    def 设置图形属性(self):
        """
        设置连接点图形项的属性。
        """
        self.setFlag(QGraphicsItem.ItemIsMovable, False)
        self.setBrush(QBrush(默认填充颜色))
        self.setPen(QPen(默认边框颜色))
        self.setFlags(QGraphicsItem.ItemSendsScenePositionChanges)
        self.setAcceptHoverEvents(True)
        self.setZValue(默认Z值)
        self.setFlag(QGraphicsItem.ItemIsSelectable)

    def mousePressEvent(self, event):
        """
        处理鼠标按下事件。

        Args:
            event (QGraphicsSceneMouseEvent): 鼠标事件对象。
        """
        # 如果鼠标右键被按下
        if event.button() == 连接线触发按键:
            print("连接线连接开始")
            # 调用场景中的连接线管理器的开始连接线方法，并传入当前图形项作为参数
            #self.接口模型.节点模型.所属节点模型管理器.连接线管理器.开始连接线(self)
            self.接口模型.节点模型.所属节点模型管理器.容器节点图形项管理器.连接线图形项管理器.开始连接线(self)
            # 忽略该事件，不再传递给其他事件接收者
            # event.ignore()
            pass
        else:
            # 如果鼠标按下的不是右键，则调用父类的鼠标按下事件处理方法
            super().mousePressEvent(event)

    def hoverEnterEvent(self, event):
        """
        处理悬停进入事件。

        Args:
            event (QGraphicsSceneHoverEvent): 悬停事件对象。
        """
        self.setCursor(QCursor(悬停光标))
        super().hoverEnterEvent(event)

    def hoverLeaveEvent(self, event):
        """
        处理悬停离开事件。

        Args:
            event (QGraphicsSceneHoverEvent): 悬停事件对象。
        """
        self.setCursor(QCursor(默认光标))
        super().hoverLeaveEvent(event)

    def mouseMoveEvent(self, 事件):
        #self.接口模型.节点模型.所属节点模型管理器.连接线管理器.连线途中(事件)
        self.接口模型.节点模型.所属节点模型管理器.容器节点图形项管理器.连接线图形项管理器.连线途中(事件)
        super().mouseMoveEvent(事件)

    def mouseReleaseEvent(self, 事件):
        print("连接线连接释放")
        if 事件.button() == 连接线触发按键:
            #self.接口模型.节点模型.所属节点模型管理器.连接线管理器.完成连线(事件)
            self.接口模型.节点模型.所属节点模型管理器.容器节点图形项管理器.连接线图形项管理器.完成连线(事件)
            pass
        super().mouseReleaseEvent(事件)

    def update(self, rect=None):
        """
        重载 update 方法，更新连接点的位置，并通知相关的连接线进行更新。
        """
        self.连接线刷新()

    def 连接线刷新(self):
        """
        更新连接点的位置，并通知相关的连接线进行更新。
        """
        # if 起始接口.接口模型.接口连接线模型列表:
        #     #print("连接线刷新")
        #     for 连接线图形项 in 起始接口.接口模型.接口连接线模型列表:
        #         连接线图形项.刷新关系()
        pass
